/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.sistema.gestionuniversitaria.dataLayer;

import com.sistema.gestionuniversitaria.BusinessLayer.*;
import java.sql.*;
import java.util.ArrayList;
import oracle.jdbc.OracleTypes;

/**
 *
 * @author Max
 */
public class CursoData extends BaseData {

    private ArrayList<Curso> cursos;

    public CursoData() {
    }

    /*
     * Metodo de Búsqueda de cursos por sigla
     */
    public Curso getCursoPorSigla(String sigla) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        Curso curso = new Curso();
        Profesor profesor = new Profesor();
        try {
            cstmt = conexion.prepareCall("{?=call BUSCAR_CURSOS_POR_SIGLA(?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.setString(2, sigla);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);

            if (resultSet.next()) {
                curso.setSigla(resultSet.getString("sigla"));
                curso.setNombre(resultSet.getString("nombre"));
                curso.setCreditos(resultSet.getInt("creditos"));
                curso.setHoras(resultSet.getInt("horas_semanales"));
                profesor.setNombre(resultSet.getString("nombre_profe"));
                curso.setProfesor(profesor);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
        if (curso
                == null) {
            throw new NoDataException("No hay datos relacionados con la búsqueda efectuada");
        }
        return curso;
    }

    /*
     * Metodo de Búsqueda de cursos por nombre
     */
    public ArrayList<Curso> getCursosPorNombre(String nombre) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        String sqlSelect = "Select sigla,nombre, creditos "
                + "From Curso  "
                + "Where nombre like '%" + nombre + "%'";

        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            statement = conexion.prepareStatement(sqlSelect);
            resultSet = statement.executeQuery();
            cursos = new ArrayList<Curso>();
            while (resultSet.next()) {
                Curso curso = new Curso();
                curso.setSigla(resultSet.getString("sigla"));
                curso.setNombre(resultSet.getString("nombre"));
                curso.setCreditos(resultSet.getInt("creditos"));
                cursos.add(curso);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (statement != null) {
                    statement.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        if (cursos == null || cursos.isEmpty()) {
            throw new NoDataException("No hay datos relacionados con la búsqueda efectuada");
        }
        return cursos;
    }

    public ArrayList<Curso> getHistorialCursos(String cedula, String codCarrera) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }

        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        cursos = new ArrayList<Curso>();
        try {
            cstmt = conexion.prepareCall("{?=call BUSCAR_HISTORIAL_CURSOS(?,?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.setString(2, cedula);
            cstmt.setString(3, codCarrera);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);
            while (resultSet.next()) {
                Curso curso = new Curso();
                curso.setSigla(resultSet.getString("sigla"));
                curso.setNombre(resultSet.getString("nombre"));
                curso.setCreditos(resultSet.getInt("creditos"));
                curso.setEstado(resultSet.getString("estado"));
                curso.setNota(resultSet.getFloat("nota"));
                cursos.add(curso);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        return cursos;
    }

    /*
     * Metodo de Búsqueda de cursos por carrera
     */
    public ArrayList<Curso> getCursosPorCarrera(String codCarrera) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        cursos = new ArrayList<Curso>();
        try {
            cstmt = conexion.prepareCall("{?=BUSCAR_CURSOS_POR_CARRERA(?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.setString(2, codCarrera);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);
            while (resultSet.next()) {
                Curso curso = new Curso();
                curso.setSigla(resultSet.getString("sigla"));
                curso.setNombre(resultSet.getString("nombre"));
                curso.setCreditos(resultSet.getInt("creditos"));
                cursos.add(curso);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
        return cursos;
    }

    public ArrayList<Curso> getCursosMatricula(String codCarrera, String cedula) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        cursos = new ArrayList<Curso>();
        try {
            cstmt = conexion.prepareCall("{?=BUSCAR_CURSOS_MATRICULA(?,?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.setString(2, cedula);
            cstmt.setString(3, codCarrera);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);
            while (resultSet.next()) {
                Curso curso = new Curso();
                curso.setSigla(resultSet.getString("sigla"));
                curso.setNombre(resultSet.getString("nombre"));
                curso.setCreditos(resultSet.getInt("creditos"));
                cursos.add(curso);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        if (cursos == null || cursos.isEmpty()) {
            throw new NoDataException("No hay datos relacionados con la búsqueda efectuada");
        }
        return cursos;
    }

    public ArrayList<Curso> getCursosProfesor(String codCarrera, String cedula) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmt = null;
        ResultSet resultSet = null;
        cursos = new ArrayList<Curso>();
        try {
            cstmt = conexion.prepareCall("{?=BUSCAR_CURSOS_PROFESOR(?,?)}");
            cstmt.registerOutParameter(1, OracleTypes.CURSOR);
            cstmt.setString(2, cedula);
            cstmt.setString(3, codCarrera);
            cstmt.execute();
            resultSet = (ResultSet) cstmt.getObject(1);
            while (resultSet.next()) {
                Curso curso = new Curso();
                curso.setSigla(resultSet.getString("sigla"));
                curso.setNombre(resultSet.getString("nombre"));
                curso.setCreditos(resultSet.getInt("creditos"));
                cursos.add(curso);
            }
        } catch (SQLException e) {
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (resultSet != null) {
                    resultSet.close();
                }
                if (cstmt != null) {
                    cstmt.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

        return cursos;
    }


    /*
     * Insertar un nuevo curso
     */
    public void insertarCurso(String sigla, String nombre, int creditos, int horasSemanales, String codCarrera, String codProfesor) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtInsertarCurso = null;
        try {
            cstmtInsertarCurso = conexion.prepareCall("{call INSERTAR_CURSO (?,?,?,?,?,?)}");
            cstmtInsertarCurso.setString(1, sigla);
            cstmtInsertarCurso.setString(2, nombre);
            cstmtInsertarCurso.setInt(3, creditos);
            cstmtInsertarCurso.setInt(4, horasSemanales);
            cstmtInsertarCurso.setString(5, codCarrera);
            cstmtInsertarCurso.setString(6, codProfesor);
            boolean resultado = cstmtInsertarCurso.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtInsertarCurso != null) {
                    cstmtInsertarCurso.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }

    /*
     * Actualizar un curso
     */
    public void actualizarCurso(String sigla, String nombre, int creditos, int horasSemanales) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtActualizarCurso = null;
        try {
            cstmtActualizarCurso = conexion.prepareCall("{call ACTUALIZAR_CURSO (?,?,?,?)}");
            cstmtActualizarCurso.setString(1, sigla);
            cstmtActualizarCurso.setString(2, nombre);
            cstmtActualizarCurso.setInt(3, creditos);
            cstmtActualizarCurso.setInt(4, horasSemanales);
            boolean resultado = cstmtActualizarCurso.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtActualizarCurso != null) {
                    cstmtActualizarCurso.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }
    /*
     * Eliminar un curso
     */

    public void eliminarCurso(String sigla) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtEliminarCurso = null;
        try {
            cstmtEliminarCurso = conexion.prepareCall("{call ELIMINAR_CURSO (?)}");
            cstmtEliminarCurso.setString(1, sigla);
            boolean resultado = cstmtEliminarCurso.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtEliminarCurso != null) {
                    cstmtEliminarCurso.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

    }

    public void eliminarCursoMatricula(String sigla, String cedula) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtEliminarCurso = null;
        try {
            cstmtEliminarCurso = conexion.prepareCall("{call ELIMINAR_CURSO_MATRICULA (?,?)}");
            cstmtEliminarCurso.setString(1, sigla);
            cstmtEliminarCurso.setString(2, cedula);
            boolean resultado = cstmtEliminarCurso.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtEliminarCurso != null) {
                    cstmtEliminarCurso.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }

    }

    public void insertarCursoMatricula(String cedula, String sigla) throws ExcepcionGlobal, NoDataException {
        try {
            getConexion();
        } catch (ClassNotFoundException e) {
            throw new ExcepcionGlobal("No se ha localizado el driver");
        } catch (SQLException e) {
            throw new NoDataException("La base de datos no se encuentra disponible");
        }
        CallableStatement cstmtInsertarCurso = null;
        try {
            cstmtInsertarCurso = conexion.prepareCall("{call INSERTAR_MATRICULA(?,?)}");
            cstmtInsertarCurso.setString(1, cedula);
            cstmtInsertarCurso.setString(2, sigla);
            boolean resultado = cstmtInsertarCurso.execute();
            if (resultado == true) {
                throw new NoDataException("No se realizo la inserción");
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw new ExcepcionGlobal("Datos no validos o nulos");
        } finally {
            try {
                if (cstmtInsertarCurso != null) {
                    cstmtInsertarCurso.close();
                }
                desconectar();
            } catch (SQLException e) {
                throw new ExcepcionGlobal("Datos invalidos o nulos");
            }
        }
    }
}
